/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package acm;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class ExtranoSueldoJefe {

    /**
     * The main method.
     *
     * @param args the command line arguments
     * @throws IOException Signals that an I/O exception has occurred.
     */
    public static void main(String[] args) throws IOException {
        // TODO code application logic here


        ArrayList[] arbol = new ArrayList[1];
        int[] totalHijos = new int[1];
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int casoP = 0;
        int raiz = 0;
// carga de datos
        String s;
        s = br.readLine();
        while ((!s.equals("0"))) {
//System.out.println("caso P= "+(++casoP));
            StringTokenizer linea = new StringTokenizer(s);
// cantidad de casos
            int cantNodos = Integer.parseInt(linea.nextToken());
//System.out.println("CantNodos = "+cantNodos);
            maximo = Integer.MIN_VALUE;
            int contador = 1;
            arbol = new ArrayList[cantNodos + 1];
            for (int i = 0; i < arbol.length; i++) {
                arbol[i] = new ArrayList<Integer>();
            }
            totalHijos = new int[cantNodos + 1];
            raiz = 0;
            s = br.readLine();
            StringTokenizer datos = new StringTokenizer(s);
            for (int i = 1; i <= cantNodos; i++) {
// para cada caso
                int papa = Integer.parseInt(datos.nextToken());
                int hijo = i;
                totalHijos[papa]++; // asi se cantidad de hijos
                int pos = totalHijos[papa];
                arbol[papa].add(hijo);
            }

            int aux = 0;
            revisar(arbol, totalHijos, raiz, contador);
            System.out.println(maximo);
            s = br.readLine();
        }

    }

    /**
     * @param unArbol arraylist de donde provienen los datos
     * @param topes
     * @param unNodo
     * @param contador que cuenta la cantidad de hijos
     */
    public static void revisar(ArrayList[] unArbol, int[] topes, int unNodo, int contador) {

        int cantHijos = topes[unNodo];
        if (cantHijos == 0) {
            return;
        }
        int hijo = 0;

        for (int i = 0; i < cantHijos; i++) {
            hijo = Integer.parseInt(unArbol[unNodo].get(i).toString());

            revisar(unArbol, topes, hijo, ++contador);
            maximo = Math.max(maximo, contador);

            contador--;
        }
        return;
    }
    static int maximo;
}
